package br.com.equus.bean;

import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ComboUtil;
import br.com.arquitetura.util.ConstantesARQ;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.arquitetura.util.Mascara;
import br.com.equus.entidade.Animal;
import br.com.equus.entidade.MedicaoAnimal;
import br.com.equus.entidade.ParteMedicao;
import br.com.equus.entidade.UnidadeMedida;
import br.com.equus.util.ValidacaoUtil;

@ManagedBean(name = "medicaoAnimalBean")
@ViewScoped
public class MedicaoAnimalBean extends PaginableBean<MedicaoAnimal> {

	private static final long serialVersionUID = 1L;

	private Animal animal;
	private Integer idParteMedicao;
	private Integer idTipoMedida;
	private List<SelectItem> listaTipoMedida;
	private List<SelectItem> listaParteMedicao;

	public MedicaoAnimalBean() {
	}

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_MEDICAO");

	}

	@PostConstruct
	public void carregarListas() {
		try {
			Integer idAnimal = (Integer) getSessionMap().remove("idAnimal");
			if (idAnimal != null) {
				animal = (Animal) universalManager.get(Animal.class, idAnimal);
			}
			listaTipoMedida = ComboUtil.getItens(universalManager.listBy(new UnidadeMedida(true)));
			Collections.sort(listaTipoMedida, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});

			listaParteMedicao = ComboUtil.getItens(universalManager.listBy(new ParteMedicao(true)));
			Collections.sort(listaParteMedicao, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	public String save() {
		try {

			if (ValidacaoUtil.doubleValido(getModel().getValorToString())) {
				getModel().setValor(Mascara.marcarDouble(getModel().getValorToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Medida ", " Está em um formato incorreto");
				return ERROR;
			}

			Animal animalAux = (Animal) universalManager.get(Animal.class, animal.getId());
			for (MedicaoAnimal med : animalAux.getMedicoes()) {

				// Se tiver id, e o registro nao for o mesmo e a parte de
				// medição for igual
				if (getModel().getId() != null && !getModel().getId().equals(med.getId())
						&& med.getParteMedicao().getId().equals(idParteMedicao)) {
					FacesMessagesUtil.addErrorMessage("Parte de Medição ", " já adicionada.");
					return ERROR;
				} else if (getModel().getId() == null && med.getParteMedicao().getId().equals(idParteMedicao)) {
					FacesMessagesUtil.addErrorMessage("Parte de Medição ", " já adicionada.");
					return ERROR;
				}
			}

			getModel().setAnimal(new Animal(animal.getId()));
			getModel().setParteMedicao((ParteMedicao) universalManager.get(ParteMedicao.class, idParteMedicao));
			getModel().setUnidadeMedida((UnidadeMedida) universalManager.get(UnidadeMedida.class, idTipoMedida));
			if (getModel().getId() == null) {
				getModel().setDtCadastro(new Date());
			}

			universalManager.save(getModel());
			idParteMedicao = null;
			idTipoMedida = null;
			setModel(new MedicaoAnimal());

			FacesMessagesUtil.addInfoMessage(this.getQualifiedName(), this.getSaveMessage() + " " + ConstantesARQ.COM_SUCESSO);
		} catch (Exception e) {
			FacesMessagesUtil.addErrorMessage(this.getQualifiedName(), ConstantesARQ.ERRO_SALVAR);
			ExcecaoUtil.tratarExcecao(e);
		}

		return SUCCESS;
	}

	@SuppressWarnings("unchecked")
	public String limparTela() {
		getSessionMap().put("idAnimal", animal.getId());
		return redirect("medicaoAnimal.jsf");
	}

	public String load() {
		try {
			idParteMedicao = getModel().getParteMedicao().getId();
			idTipoMedida = getModel().getUnidadeMedida().getId();
			getModel().setValorToString(getModel().getValor().toString());
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return SUCCESS;
	}

	@Override
	public MedicaoAnimal createModel() {
		return new MedicaoAnimal();
	}

	@Override
	public String getQualifiedName() {
		return "Medição do Animal";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	@Override
	public Map<String, String> getFilters() {
		if (animal != null && animal.getId() != null) {
			this.filters.put("animal.id", animal.getId().toString());
		} else {
			this.filters.put("animal.id", "0");
		}
		return this.filters;
	}

	public Animal getAnimal() {
		return animal;
	}

	public void setAnimal(Animal animal) {
		this.animal = animal;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Integer getIdParteMedicao() {
		return idParteMedicao;
	}

	public void setIdParteMedicao(Integer idParteMedicao) {
		this.idParteMedicao = idParteMedicao;
	}

	public Integer getIdTipoMedida() {
		return idTipoMedida;
	}

	public void setIdTipoMedida(Integer idTipoMedida) {
		this.idTipoMedida = idTipoMedida;
	}

	public List<SelectItem> getListaTipoMedida() {
		return listaTipoMedida;
	}

	public void setListaTipoMedida(List<SelectItem> listaTipoMedida) {
		this.listaTipoMedida = listaTipoMedida;
	}

	public List<SelectItem> getListaParteMedicao() {
		return listaParteMedicao;
	}

	public void setListaParteMedicao(List<SelectItem> listaParteMedicao) {
		this.listaParteMedicao = listaParteMedicao;
	}

}
